// 相机方法归类   设置相机位置、方向和变换。

import { SuperMap3D } from '@/utils/supermap3d';

// 1、camera.setView(options)
export const setCameraView = (
  viewer,
  location,
  orientation = {
    // 方位角
    heading: SuperMap3D.Math.toRadians(0),
    // 俯仰角
    pitch: SuperMap3D.Math.toRadians(-90),
    // 滚动角
    roll: 0.0,
  },
  duration = 3,
  convert = true,
) => {
  viewer.camera.setView({
    // 相机在WGS84世界坐标系中的最终位置，或是自顶向下视图中可见的矩形区域。
    destination: SuperMap3D.Cartesian3.fromDegrees(...location),
    orientation,
    duration,
    // 是否将相机最终位置从世界坐标转换为场景坐标，默认值True。
    convert,
  });
};

// camera.flyTo(target, options): 使相机飞行到指定的目标位置，并设置相应的动画效果和参数。
// 2、
/**
 * 飞行动画
 * @param {*} viewer 场景
 * @param {Array} location 经、纬度、高度
 * @param {*} orientation 旋转角度
 * @param {*} duration 飞行时间
 */
export const flyTo = (
  viewer,
  location,
  orientation = {
    // 方位角
    heading: SuperMap3D.Math.toRadians(0),
    // 俯仰角
    pitch: SuperMap3D.Math.toRadians(-90),
    // 滚动角
    roll: 0.0,
  },
  duration = 3,
) => {
  viewer.camera.flyTo({
    // 相机在WGS84世界坐标系中的最终位置，或是自顶向下视图中可见的矩形区域。
    destination: new SuperMap3D.Cartesian3.fromDegrees(...location),
    orientation,
    duration,
    // 飞行结束后的回调
    complete: function () {},
  });
};

/**
 * camera.moveEnd.addEventListener
 * 监听相机位置
 */
export const cameraListener = (viewer, position) => {
  viewer.camera.moveEnd.addEventListener(() => {
    // 世界坐标系
    const result = SuperMap3D.Cartographic.fromCartesian(position);
    // 纬度
    const latitude = SuperMap3D.Math.toDegrees(result.latitude);
    // 经度
    const longitude = SuperMap3D.Math.toDegrees(result.longitude);
    console.log(viewer.camera.position);

    return {
      lng: longitude,
      lat: latitude,
    };
  });
};

/**
 * 启动相机信息监听器 获取相机位置，姿态等
 * @param viewer SuperMap3D Viewer 实例
 * @param onUpdate 回调函数（每次更新时调用）
 * 新增了限流功能 通过lastUpdate判断是否在100ms内更新
 */

// export interface CameraInfo {
//   longitude: string;
//   latitude: string;
//   height: string;
//   heading: string;
//   pitch: string;
//   roll: string;
//   cartesian3Position?: any;
// }
// let lastUpdate = 0;
//
// export function startCameraInfoTracking(viewer, onUpdate: (info: CameraInfo) => void) {
//   viewer.scene.postRender.addEventListener(() => {
//     const now = Date.now();
//     if (now - lastUpdate < 100) return; // 每 100ms 更新一次
//     lastUpdate = now;
//     // 获取位置 wgs84的地心坐标系，x,y坐标值以弧度来表示
//     const position = viewer.scene.camera.positionCartographic; //with longitude and latitude expressed in radians and height in meters.
//     const cameraInfo: CameraInfo = {
//       // 弧度转经纬度
//       longitude: SuperMap3D.Math.toDegrees(position.longitude).toFixed(6),
//       latitude: SuperMap3D.Math.toDegrees(position.latitude).toFixed(6),
//       height: position.height,
//       // 获取 相机姿态信息
//       heading: SuperMap3D.Math.toDegrees(viewer.camera.heading),
//       pitch: SuperMap3D.Math.toDegrees(viewer.camera.pitch),
//       roll: SuperMap3D.Math.toDegrees(viewer.camera.roll),
//       cartesian3Position: viewer.scene.camera.position,
//     };
//     onUpdate(cameraInfo);
//   });
// }
